home *** CD-ROM | disk | FTP | other *** search
- /* See license.txt for terms of usage */
-
- //
- FBL.ns(function() { with (FBL) {
-
- // ************************************************************************************************
- // Constants
-
- const Cc = Components.classes;
- const Ci = Components.interfaces;
-
- top.Firebug.Console.injector =
- {
- isAttached: function(context, win)
- {
- if (win.wrappedJSObject)
- {
- var attached = (win.wrappedJSObject._getFirebugConsoleElement ? true : false);
- return attached;
- }
- else
- {
- return (win._getFirebugConsoleElement ? true : false);
- }
- },
-
- attachIfNeeded: function(context, win)
- {
- if (this.isAttached(context, win))
- return true;
-
- this.attachConsoleInjector(context, win);
- this.addConsoleListener(context, win);
-
- Firebug.Console.clearReloadWarning(context);
-
- var attached = this.isAttached(context, win);
- if (attached)
- dispatch(Firebug.Console.fbListeners, "onConsoleInjected", [context, win]);
-
- return attached;
- },
-
- attachConsoleInjector: function(context, win)
- {
- var consoleInjection = this.getConsoleInjectionScript(); // Do it all here.
-
- Firebug.CommandLine.evaluateInWebPage(consoleInjection, context, win);
-
- },
-
- getConsoleInjectionScript: function() {
- if (!this.consoleInjectionScript)
- {
- var script = "";
- script += "window.__defineGetter__('console', function() {\n";
- script += " return (window._firebug ? window._firebug : window.loadFirebugConsole()); })\n\n";
-
- script += "window.loadFirebugConsole = function() {\n";
- script += "window._firebug = new _FirebugConsole();";
-
- script += " return window._firebug };\n";
-
- var theFirebugConsoleScript = getResource("chrome://firebug/content/consoleInjected.js");
- script += theFirebugConsoleScript;
-
-
- this.consoleInjectionScript = script;
- }
- return this.consoleInjectionScript;
- },
-
- forceConsoleCompilationInPage: function(context, win)
- {
- if (!win)
- {
- return;
- }
-
- var consoleForcer = "window.loadFirebugConsole();";
-
- if (context.stopped)
- Firebug.Console.injector.evaluateConsoleScript(context); // todo evaluate consoleForcer on stack
- else
- Firebug.CommandLine.evaluateInWebPage(consoleForcer, context, win);
-
- },
-
- evaluateConsoleScript: function(context)
- {
- var scriptSource = this.getConsoleInjectionScript(); // TODO XXXjjb this should be getConsoleInjectionScript
- Firebug.Debugger.evaluate(scriptSource, context);
- },
-
- addConsoleListener: function(context, win)
- {
- if (!context.activeConsoleHandlers) // then we have not been this way before
- context.activeConsoleHandlers = [];
- else
- { // we've been this way before...
- for (var i=0; i<context.activeConsoleHandlers.length; i++)
- {
- if (context.activeConsoleHandlers[i].window == win)
- {
- context.activeConsoleHandlers[i].detach();
- context.activeConsoleHandlers.splice(i,1);
- }
- }
- }
-
- // We need the element to attach our event listener.
- var element = Firebug.Console.getFirebugConsoleElement(context, win);
- if (element)
- element.setAttribute("FirebugVersion", Firebug.version); // Initialize Firebug version.
- else
- return false;
-
- var handler = new FirebugConsoleHandler(context, win);
- handler.attachTo(element);
-
- context.activeConsoleHandlers.push(handler);
-
- return true;
- },
-
- detachConsole: function(context, win)
- {
- if (win && win.document)
- {
- var element = win.document.getElementById("_firebugConsole");
- if (element)
- element.parentNode.removeChild(element);
- }
- },
- }
-
- var total_handlers = 0;
- function FirebugConsoleHandler(context, win)
- {
- this.window = win;
-
- this.attachTo = function(element)
- {
- this.element = element;
- // When raised on our injected element, callback to Firebug and append to console
- this.boundHandler = bind(this.handleEvent, this);
- this.element.addEventListener('firebugAppendConsole', this.boundHandler, true); // capturing
- };
-
- this.detach = function()
- {
- this.element.removeEventListener('firebugAppendConsole', this.boundHandler, true);
- };
-
- this.handler_name = ++total_handlers;
- this.handleEvent = function(event)
- {
- if (!Firebug.CommandLine.CommandHandler.handle(event, this, win))
- {
- var methodName = event.target.getAttribute("methodName");
- Firebug.Console.log($STRF("console.MethodNotSupported", [methodName]));
- }
- };
-
- this.firebug = Firebug.version;
-
- this.init = function()
- {
- var consoleElement = win.document.getElementById('_firebugConsole');
- consoleElement.setAttribute("FirebugVersion", Firebug.version);
- };
-
- this.log = function()
- {
- logFormatted(arguments, "log");
- };
-
- this.debug = function()
- {
- logFormatted(arguments, "debug", true);
- };
-
- this.info = function()
- {
- logFormatted(arguments, "info", true);
- };
-
- this.warn = function()
- {
- logFormatted(arguments, "warn", true);
- };
-
- this.error = function()
- {
- if (arguments.length == 1)
- {
- logAssert("error", arguments); // add more info based on stack trace
- }
- else
- {
- Firebug.Errors.increaseCount(context);
- logFormatted(arguments, "error", true); // user already added info
- }
- };
-
- this.exception = function()
- {
- logAssert("error", arguments);
- };
-
- this.assert = function(x)
- {
- if (!x)
- {
- var rest = [];
- for (var i = 1; i < arguments.length; i++)
- rest.push(arguments[i]);
- logAssert("assert", rest);
- }
- };
-
- this.dir = function(o)
- {
- Firebug.Console.log(o, context, "dir", Firebug.DOMPanel.DirTable);
- };
-
- this.dirxml = function(o)
- {
- if (o instanceof Window)
- o = o.document.documentElement;
- else if (o instanceof Document)
- o = o.documentElement;
-
- Firebug.Console.log(o, context, "dirxml", Firebug.HTMLPanel.SoloElement);
- };
-
- this.group = function()
- {
- var sourceLink = getStackLink();
- Firebug.Console.openGroup(arguments, null, "group", null, false, sourceLink);
- };
-
- this.groupEnd = function()
- {
- Firebug.Console.closeGroup(context);
- };
-
- this.groupCollapsed = function()
- {
- var sourceLink = getStackLink();
- // noThrottle true is probably ok, openGroups will likely be short strings.
- var row = Firebug.Console.openGroup(arguments, null, "group", null, true, sourceLink);
- removeClass(row, "opened");
- };
-
- this.profile = function(title)
- {
- Firebug.Profiler.startProfiling(context, title);
- };
-
- this.profileEnd = function()
- {
- Firebug.Profiler.stopProfiling(context);
- };
-
- this.count = function(key)
- {
- var frameId = FBL.getStackFrameId();
- if (frameId)
- {
- if (!context.frameCounters)
- context.frameCounters = {};
-
- if (key != undefined)
- frameId += key;
-
- var frameCounter = context.frameCounters[frameId];
- if (!frameCounter)
- {
- var logRow = logFormatted(["0"], null, true, true);
-
- frameCounter = {logRow: logRow, count: 1};
- context.frameCounters[frameId] = frameCounter;
- }
- else
- ++frameCounter.count;
-
- var label = key == undefined
- ? frameCounter.count
- : key + " " + frameCounter.count;
-
- frameCounter.logRow.firstChild.firstChild.nodeValue = label;
- }
- };
-
- this.clear = function()
- {
- Firebug.Console.clear(context);
- };
-
- this.time = function(name, reset)
- {
- if (!name)
- return;
-
- var time = new Date().getTime();
-
- if (!this.timeCounters)
- this.timeCounters = {};
-
- var key = "KEY"+name.toString();
-
- if (!reset && this.timeCounters[key])
- return;
-
- this.timeCounters[key] = time;
- };
-
- this.timeEnd = function(name)
- {
- var time = new Date().getTime();
-
- if (!this.timeCounters)
- return;
-
- var key = "KEY"+name.toString();
-
- var timeCounter = this.timeCounters[key];
- if (timeCounter)
- {
- var diff = time - timeCounter;
- var label = name + ": " + diff + "ms";
-
- this.info(label);
-
- delete this.timeCounters[key];
- }
- return diff;
- };
-
- // These functions are over-ridden by commandLine
- this.evaluated = function(result, context)
- {
- Firebug.Console.log(result, context);
- };
- this.evaluateError = function(result, context)
- {
- Firebug.Console.log(result, context, "errorMessage");
- };
-
- // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
-
- function logFormatted(args, className, linkToSource, noThrottle)
- {
- var sourceLink = linkToSource ? getStackLink() : null;
- return Firebug.Console.logFormatted(args, context, className, noThrottle, sourceLink);
- }
-
- function logAssert(category, args)
- {
- Firebug.Errors.increaseCount(context);
-
- if (!args || !args.length || args.length == 0)
- var msg = [FBL.$STR("Assertion")];
- else
- var msg = args[0];
-
- if (Firebug.errorStackTrace)
- {
- var trace = Firebug.errorStackTrace;
- delete Firebug.errorStackTrace;
- }
- else if (msg.stack)
- {
- var trace = parseToStackTrace(msg.stack);
- }
- else
- {
- var trace = getJSDUserStack();
- }
-
- var errorObject = new FBL.ErrorMessage(msg, (msg.fileName?msg.fileName:win.location), (msg.lineNumber?msg.lineNumber:0), "", category, context, trace);
-
-
- if (trace && trace.frames && trace.frames[0])
- errorObject.correctWithStackTrace(trace);
-
- errorObject.resetSource();
-
- var objects = errorObject;
- if (args.length > 1)
- {
- objects = [errorObject];
- for (var i = 1; i < args.length; i++)
- objects.push(args[i]);
- }
-
- var row = Firebug.Console.log(objects, context, "errorMessage", null, true); // noThrottle
- row.scrollIntoView();
- }
-
- function getComponentsStackDump()
- {
- // Starting with our stack, walk back to the user-level code
- var frame = Components.stack;
- var userURL = win.location.href.toString();
-
- while (frame && FBL.isSystemURL(frame.filename) )
- frame = frame.caller;
-
- // Drop two more frames, the injected console function and firebugAppendConsole()
- if (frame)
- frame = frame.caller;
- if (frame)
- frame = frame.caller;
-
- return frame;
- }
-
- function getStackLink()
- {
- return FBL.getFrameSourceLink(getComponentsStackDump());
- }
-
- function getJSDUserStack()
- {
- var trace = FBL.getCurrentStackTrace(context);
-
- var frames = trace ? trace.frames : null;
- if (frames && (frames.length > 0) )
- {
- var oldest = frames.length - 1; // 6 - 1 = 5
- for (var i = 0; i < frames.length; i++)
- {
- if (frames[oldest - i].href.indexOf("chrome:") == 0) break;
- var fn = frames[oldest - i].fn + "";
- if (fn && (fn.indexOf("_firebugEvalEvent") != -1) ) break; // command line
- }
- FBTrace.sysout("consoleInjector getJSDUserStack: "+frames.length+" oldest: "+oldest+" i: "+i+" i - oldest + 2: "+(i - oldest + 2), trace);
- trace.frames = trace.frames.slice(2 - i); // take the oldest frames, leave 2 behind they are injection code
-
- return trace;
- }
- else
- return "Firebug failed to get stack trace with any frames";
- }
- }
-
- }});
-